﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace SalaDeEnsayo.ApplicationService
{
    public class ReporteService : BaseService
    {
        public List<ReporteSalasReservadas> ObtenerSalasReservadas(DateTime? fecha_desde, DateTime? fecha_hasta, int? id_sala, long? id_grupo)
        {
            List<ReporteSalasReservadas> listaSalasReservadas = new List<ReporteSalasReservadas>();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("ReporteReservas", fecha_desde, fecha_hasta, id_sala, id_grupo))
            {
                while (dr.Read())
                {
                    listaSalasReservadas.Add(new ReporteSalasReservadas(
                        dr["Sala"] is DBNull ? string.Empty : (string)dr["Sala"],
                        dr["Dia"] is DBNull ? string.Empty : (string)dr["Dia"],
                        dr["Entrada"] is DBNull ? string.Empty : (string)dr["Entrada"],
                        dr["Salida"] is DBNull ? string.Empty : (string)dr["Salida"],
                        dr["Grupo"] is DBNull ? string.Empty : (string)dr["Grupo"]));
                }
            }
            return listaSalasReservadas;
        }

        public List<ReporteProductosVendidos> ObtenerProductosVendidos(DateTime? fecha_desde, DateTime? fecha_hasta, int? id_tipo, long? id_producto)
        {
            List<ReporteProductosVendidos> listaReporte = new List<ReporteProductosVendidos>();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("ReporteProductosVendidos", id_producto, id_tipo, fecha_desde, fecha_hasta))
            {
                while (dr.Read())
                {
                    listaReporte.Add(new ReporteProductosVendidos(
                        dr["Id"] is DBNull ? 0 : (long)dr["Id"],
                        dr["Cantidad Vendida"] is DBNull ? 0 : (long)dr["Cantidad Vendida"],
                        dr["Producto"] is DBNull ? string.Empty : (string)dr["Producto"]));
                }
            }
            return listaReporte;
        }

        public List<ReporteRecaudacion> ObtenerRecaudacion(DateTime? fecha_desde, DateTime? fecha_hasta)
        {
            List<ReporteRecaudacion> listaRecaudacion = new List<ReporteRecaudacion>();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("ReporteRecaudacion", fecha_desde, fecha_hasta))
            {
                while (dr.Read())
                {
                    listaRecaudacion.Add(new ReporteRecaudacion(
                        dr["idSala"] is DBNull ? 0 : (long)dr["idSala"],
                        dr["recaudacion"] is DBNull ? 0 : (Decimal)dr["recaudacion"],
                        dr["Nombre"] is DBNull ? string.Empty : (string)dr["Nombre"]
                        ));
                }
            }
            return listaRecaudacion;
        }
    }

    public class ReporteProductosVendidos
    {
        public long Id { get; set; }
        public long Cantidad { get; set; }
        public string Descripcion { get; set; }

        public ReporteProductosVendidos(long id_producto, long cantidad, string descripcion)
        {
            this.Id = id_producto;
            this.Cantidad = cantidad;
            this.Descripcion = descripcion;
        }
    }

    public class ReporteSalasReservadas
    {
        public string Sala { get; set; }
        public string Dia { get; set; }
        public string Entrada { get; set; }
        public string Salida { get; set; }
        public string Grupo { get; set; }

        public ReporteSalasReservadas(string sala, string dia, string entrada, string salida, string grupo)
        {
            this.Sala = sala;
            this.Dia = dia;
            this.Entrada = entrada;
            this.Salida = salida;
            this.Grupo = grupo;
        }
    }

    public class ReporteRecaudacion
    {
        public long Id_sala { get; set; }
        public Decimal Recaudacion { get; set; }
        public string Nombre { get; set; }

        public ReporteRecaudacion(long id_sala, Decimal recaudacion, string nombre)
        {
            this.Id_sala = id_sala;
            this.Recaudacion = recaudacion;
            this.Nombre = nombre;
        }
    }
}